mydata <- read.table("Insurance.csv", header=TRUE, sep=",", dec=".")
mydata <- mydata[-6]
mydata$ID <- seq(1, nrow(mydata))
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
mydata <- mydata %>%
mutate(Gender = replace(Gender, Gender == "female", "F")) %>%
mutate(Gender = replace(Gender, Gender == "male", "M")) %>%
mutate(Smoker = replace(Smoker, Smoker == "yes", "Yes")) %>%
mutate(Smoker = replace(Smoker, Smoker == "no", "No"))
set.seed(10)
mydata <- mydata[c(7, 6, 1, 2, 3, 4, 5)] [sample(1:1338, size = 140), ]
mydata$Cost <- round(mydata$Cost, 0)
mydata$BMI <- round(mydata$BMI, 1)
rownames(mydata) <- seq(1, nrow(mydata))
head(mydata)
## ID Cost Age Gender BMI Kids Smoker
## 1 491 1749 19 F 32.9 0 No
## 2 368 8017 42 F 25.0 2 No
## 3 439 12593 52 F 46.8 5 No
## 4 344 13982 63 M 36.8 0 No
## 5 1295 11931 58 M 25.2 0 No
## 6 143 18972 34 M 25.3 2 Yes
Description:
mydata$GenderF <- factor(mydata$Gender, levels = c("F", "M"))
mydata$SmokerF <- factor(mydata$Smoker, levels = c("No", "Yes"))
library(dplyr)
mydata %>%
select(Cost, Age, BMI, Kids, GenderF, SmokerF) %>%
summary()
## Cost Age BMI Kids
## Min. : 1141 Min. :18.00 Min. :17.80 Min. :0.00
## 1st Qu.: 5700 1st Qu.:31.00 1st Qu.:26.10 1st Qu.:0.00
## Median :10652 Median :43.00 Median :31.30 Median :1.00
## Mean :13789 Mean :42.34 Mean :31.15 Mean :1.25
## 3rd Qu.:14476 3rd Qu.:55.00 3rd Qu.:35.88 3rd Qu.:2.00
## Max. :60021 Max. :64.00 Max. :49.10 Max. :5.00
## GenderF SmokerF
## F:71 No :113
## M:69 Yes: 27
##
##
##
##
library(GGally) # Load tools for scatterplot matrices
ggpairs(
mydata[c("Cost", "Age", "BMI", "Kids", "GenderF", "SmokerF")], # Variables to display
upper = list(
continuous = wrap("smooth", method = "lm", se = FALSE, alpha = 0.6) # Scatterplots with OLS line
),
lower = list(continuous = "cor"), # Pearson correlation coefficients
diag = list(continuous = "densityDiag") # Density plots on the diagonal
) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size = 7),
axis.text.y = element_text(size = 7)
)
fit <- lm(Cost ~ Age + BMI + Kids + GenderF+ SmokerF,
data = mydata)
vif(fit)
## Age BMI Kids GenderF SmokerF
## 1.028518 1.024215 1.005644 1.004913 1.011513
mean(vif(fit))
## [1] 1.014961
mydata$StdResid <- rstandard(fit)
hist(mydata$StdResid,
xlab = "Standardised residuals",
ylab = "Frequency",
main = "Histogram of standardised residuals")
shapiro.test(mydata$StdResid)
##
## Shapiro-Wilk normality test
##
## data: mydata$StdResid
## W = 0.85838, p-value = 2.893e-10
library(dplyr)
# Calculate Cook's distance
mydata$CooksD <- cooks.distance(fit)
# Define Cook's distance threshold
cd_threshold <- 4/nrow(mydata)
# Display apartments with Cook's distance above the threshold
influential_units <- mydata %>%
filter(CooksD > cd_threshold) %>%
arrange(desc(CooksD)) %>%
select(ID, Cost, Age, BMI, Kids, GenderF, SmokerF, StdResid, CooksD)
head(influential_units, 6) %>%
mutate(StdResid = round(StdResid, 3),
CooksD = round(CooksD, 3))
## ID Cost Age BMI Kids GenderF SmokerF StdResid CooksD
## 1 1028 21595 23 18.7 0 M No 3.726 0.149
## 2 1231 60021 52 34.5 3 M Yes 3.624 0.146
## 3 1013 36580 61 33.3 4 F No 3.265 0.103
## 4 527 24060 19 30.6 2 F No 3.384 0.077
## 5 63 30167 64 24.7 1 M No 2.899 0.065
## 6 267 17180 40 19.8 1 M Yes -1.979 0.046
mydata$StdFitted <- scale(fit$fitted.values)
library(car)
scatterplot(y = mydata$StdResid, x = mydata$StdFitted,
ylab = "Standardised residuals",
xlab = "Standardised fitted values",
boxplots = FALSE,
regLine = FALSE,
smooth = FALSE)
library(olsrr)
##
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
##
## rivers
ols_test_breusch_pagan(fit)
##
## Breusch Pagan Test for Heteroskedasticity
## -----------------------------------------
## Ho: the variance is constant
## Ha: the variance is not constant
##
## Data
## --------------------------------
## Response : Cost
## Variables: fitted values of Cost
##
## Test Summary
## -------------------------------
## DF = 1
## Chi2 = 31.01132
## Prob > Chi2 = 2.565275e-08
library(estimatr)
fit2 <- lm_robust(Cost ~ Age + BMI + Kids + GenderF+ SmokerF,
se_type = "HC1",
data = mydata)
summary(fit2)
##
## Call:
## lm_robust(formula = Cost ~ Age + BMI + Kids + GenderF + SmokerF,
## data = mydata, se_type = "HC1")
##
## Standard error type: HC1
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper
## (Intercept) -12382.1 3763.39 -3.2901 1.280e-03 -19825.428 -4938.8
## Age 264.8 40.79 6.4916 1.521e-09 184.104 345.4
## BMI 304.1 98.36 3.0917 2.422e-03 109.557 498.6
## Kids 734.5 369.45 1.9882 4.883e-02 3.826 1465.2
## GenderFM -268.1 1053.46 -0.2545 7.995e-01 -2351.650 1815.5
## SmokerFYes 24380.5 1959.58 12.4417 4.233e-24 20504.825 28256.2
## DF
## (Intercept) 134
## Age 134
## BMI 134
## Kids 134
## GenderFM 134
## SmokerFYes 134
##
## Multiple R-squared: 0.7395 , Adjusted R-squared: 0.7298
## F-statistic: 37.91 on 5 and 134 DF, p-value: < 2.2e-16